<?php


namespace app\api\controller;


use app\common\controller\Api;
use app\common\logic\TronLogic;
use IEXBase\TronAPI\Exception\TronException;
use think\Exception;
use think\Log;
use think\Queue;
use think\Request;
use app\common\model\Project;
use app\common\model\TrcAddress;


/**
 *
 *
 *
 * 编码环境win10  php7.3 linux请注意目录大小写的区分
 * 所有测试功能都在api模块中，请使用postman测试，后台没有做功能  谢谢
 *
 * 如果你觉得代码不错 对您的项目有帮助 谢谢你的使用 我的地址：TKauo6SnhLNyTDvkVByR13cR7S5xnq3yT4
 * Class Address
 * @package app\api\controller
 */
class Address extends Api
{
    protected $noNeedLogin = "*";
    protected $noNeedRight = "*";

    public function _initialize()
    {
        parent::_initialize();
    }


    /**
     * TODO：该代码希望你至少知道一些区块链的基础概念，如地址、公钥、私钥、合约等。如不清楚，请先查阅【至少】一次官方文档，谢谢！！！
     * TODO：文档地址：https://cn.developers.tron.network/reference  术语地址： https://cn.developers.tron.network/docs/glossary
     *
     *
     *
     * 创建一个地址  http://127.0.0.1/api/address/create
     *
     *
     * 这里最开始设计的是有很多个项目  然后每个项目下有有很多地址
     * 然后根据项目来管理这些地址，如果不需要 就直接用TronLogic中的方法创建就是了，或者直接将TronLogic复制到你的代码中，
     * composer安装好依赖包也是可以运行的
     *
     * 数据库看看fa_project  fa_trc_address fa_trc_transaction 三张表的关系
     * 归集和交易监听在\push\controller\Worker.php中 使用的workerman中的定时器和think-queue队列
     *
     * @param Request $request
     * @throws Exception
     * @throws TronException
     * @throws \think\db\exception\DataNotFoundException
     * @throws \think\db\exception\ModelNotFoundException
     * @throws \think\exception\DbException
     */
    public function create(Request $request){
        # 每个项目的token
//        $token = $request->header('api-token');
//
//        if (empty($token)) $this->error("非法请求");
//
//        $project = (new Project())->where('token',$token)->find();
//        if (empty($project)) $this->error("无效请求");
//        if ($project['status'] == 'N') $this->error("项目已失效");

        $trc = new TronLogic();
        $result = $trc->createAddress();
        pr($result);

//        Array
//        (
//            [address] => TTMqBLcvaqTWDdZha8iPHaJKeiRtNnbEmj
//            [privateKey] => d647d539f3a925b7686450845d562d7cfe3651b82164eedb75af719a34f0e51c
//            [publicKey] => 041d2986eebb1070684ab224a73527d42df3e677c04cbf606ce57d2e2f21e536614cd72daaf4dfd6d666b6d1665fbda79ce7b03ea22ea59dbd5c05f5eebed1e0e2
//            [result] => Array
//              (
//                  [result] => 1
//                  [txid] => 13b997df5d105a8f31cedcfbad45b6ef7f5a071af8d6d25cd94c4d304fd4be9e
//              )
//
//)


        // 激活成功$result['result']['result']返回为1  否则创建了地址但是是未激活的
        // $result['result']['result'] 可能为空  请检查你的网络环境  请多试几次
        if ($result['result']['result'] == 1){
            if ((new TrcAddress())->save([
                //"project_id" => $project['id'],
                //"user_id" => $project['user_id'],
                "address" => $result['address'],
                "private_key" => $result['privateKey'],
                "createtime" => time()
            ])){
                $this->success(__("请求成功"),[
                    "address" => $result['address']
                ]);
            }
        }
        Log::write("创建地址:". $result['result']['result'],"info");
        $this->error("请求失败");
    }

    /**
     * trx转账
     * @throws Exception
     */
    public function trxTransaction(){
        $trc = new TronLogic();
        $result = $trc->trxTransaction("TEfN55NAX8Ris1y31h4Z7kjYjwdTifvjYb","10");
        pr($result);
    }

    /**
     * 余额TRX查询
     */
    public function getAccount(){
        $trc = new TronLogic();
        $result = $trc->getAccount("TEfN55NAX8Ris1y31h4Z7kjYjwdTifvjYb");
        pr($result );
    }



    /**
     * TRC20合约转账
     * @throws Exception
     */
    public function trc20Transaction(){
        $trc = new TronLogic();
        $result = $trc->trc20Transaction("TEfN55NAX8Ris1y31h4Z7kjYjwdTifvjYb","1","LK");
        pr($result);
    }


    /**
     * 获取合约余额
     */
    public function getTrc20Balance(){
        $trc = new TronLogic();
        $result = $trc->getTrc20Balance("TMuvMdGYH8mcfRNQZrHGNss6mXPFxqmKWC","LK");
        pr($result);
    }

    /**
     * 队列测试
     * 使用think-queue 队列  使用方法请查阅官方文档 谢谢
     *
     */
    public function queueTest(){
        $queueClassName = "app\\job\\Task@collection";
        $queueName = "Trc20CollectionQueue";
        $r= Queue::push($queueClassName,['a' => 6666],$queueName);
        pr($r);
    }

    /**
     * 归集
     * @throws Exception
     */
    public function collectionTrc20(){
        $trc = new TronLogic();
        $trc->collectionTrc20('xxxx','xxx','LK');
    }
}

